const express = require('express')
const fs = require('fs')
const path = require('path')
const app = express()
//全局中间件=======================================
//1、声明中间件回调函数
function middleWare(req, res, next) {
	const {
		url,
		ip
	} = req
	fs.appendFileSync(path.resolve(__dirname, './logger.txt'), `${url} ${ip}\r\n`)
	console.log('全局中间件')
	//调用next函数执行后续逻辑（交给路由或者后续中间件）
	next()
}
//静态资源中间件=======================================
app.use(express.static(path.resolve(__dirname, './public'))) //自动设置静态资源的响应，包括对MIME类型的设置

//路由中间件=======================================
//案例：要求login和register需要有请求参数code=521才能通过，否则直接返回错误
//1、声明中间件
const secretMiddleWare = (req, res, next) => {
	if (req.query.code === '521') {
		next()
	} else {
		res.send('暗号错误，you shall not pass!')
	}
}

//2、在路由中使用中间件（加到第二个参数）
app.get('/login', secretMiddleWare, (req, res) => {
	console.log('/login拦截')
	res.end('登录成功')
})
//2、使用中间件
app.use(middleWare)

app.get('/', (req, res) => {
	res.end('Home')
})

app.get('/register', secretMiddleWare, (req, res) => {
	res.setHeader('content-type', 'text/html')
	res.end('注册成功,success')
})
//all表示匹配所有方法请求的，包括get\post等
app.all('/test', (req, res) => {
	res.end('test test')
})
//在所有路由的最后使用/{*任意字符串}匹配所有路径，可以发送404响应
app.all('/{*path}', (req, res) => {
	res.end('404 NOT FOUND')
})

app.listen(9000, () => {
	console.log('开始监听')
})
//有两个点要注意的：
// 1、如果写了静态资源中间件而且该文件夹下有index.html，则当在浏览器输入路径为'/'的时候，可以自动重定向到该文件，
// 如果同时也有自己写的路由能匹配'/',那么就看谁写在最前面，这个例子就是自己写的app.get('/')在最前面所以最先拦截相应。
//也就是说，中间件（包括全局中间件）实际上是和自己写的路由是平级的，但是一般将全局中间件和静态资源中间件写在前面
//2、静态资源中间件响应静态资源，路由响应动态资源